/*
Longest Substring Without Repeating Characters
===============================================

Given a string s, find the length of the longest substring without repeating characters.

Example 1:
Input: s = "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.

Example 2:
Input: s = "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.

Example 3:
Input: s = "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3.
Notice that the answer must be a substring, "pwke" is a subsequence and not a substring.

Example 4:
Input: s = ""
Output: 0

Constraints:
0 <= s.length <= 5 * 104
s consists of English letters, digits, symbols and spaces.
*/

class Solution
{
public:
  int lengthOfLongestSubstring(string s)
  {
    int n = s.size();
    if (n <= 1)
      return n;
    if (n == 2 && s[0] != s[1])
      return n;

    int ans = 0;
    set<char> visited;

    for (int i = 0, j = 0; i < n && j < n;)
    {
      if (visited.find(s[j]) == visited.end())
      {
        visited.insert(s[j]);
        j++;
        ans = max(ans, j - i);
      }
      else
      {
        visited.erase(s[i]);
        i++;
      }
    }

    return ans;
  }
};
